package com.it.gmall.all.controller;

import com.it.gmall.common.result.Result;
import com.it.gmall.model.product.BaseCategoryView;
import com.it.gmall.product.client.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

@Controller
public class IndexController {
    @Autowired
    private ProductFeignClient productFeignClient;

    /**
     * 获取首页分页数据-使用遍历
     * @param model
     * @return
     */
    @GetMapping("/")
    public String getIndexData(Model model){

        List<Map> map = getIndexCategoryData();

        model.addAttribute("list",map);
        return "index/index";
    }

    /**
     * 获取首页的分类数据
     * @return
     */
    private List<Map> getIndexCategoryData() {
        // 获取全部3级分类视图数据
        List<BaseCategoryView> baseCategoryViewList = productFeignClient.getBaseCategoryViewList();
        // 返回结果
        List<Map> map = new ArrayList<>();

        // 根据一级分类id分组
        /*long: 一级分类的id
        * list<>: 对应的分组*/
        Map<Long, List<BaseCategoryView>> mapByBaseCategory1Id
                = baseCategoryViewList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));

        Set<Map.Entry<Long, List<BaseCategoryView>>> entrySet = mapByBaseCategory1Id.entrySet();
        int index=1;
        for (Map.Entry<Long, List<BaseCategoryView>> longListEntry : entrySet) {
            List<BaseCategoryView> valueCategory1 = longListEntry.getValue(); // 获取分类数据
            Map map1 = new HashMap();
            map1.put("index",index++);
            map1.put("categoryName",valueCategory1.get(0).getCategory1Name()); // 1级分类的名称
            map1.put("categoryId",longListEntry.getKey());  // 1级分类的id


            /////////////////////////二级////////////////////////////////
            List<Map> mapCategory2 = new ArrayList<>();
            Map<Long, List<BaseCategoryView>> mapByBaseCategory2Id
                    = valueCategory1.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
            Set<Map.Entry<Long, List<BaseCategoryView>>> entrySet2 = mapByBaseCategory2Id.entrySet();
            for (Map.Entry<Long, List<BaseCategoryView>> listEntry : entrySet2) {
                List<BaseCategoryView> valueCategory2 = listEntry.getValue();
                Map map2 = new HashMap();
                map2.put("categoryName",valueCategory2.get(0).getCategory2Name()); // 二级分类的名称
                map2.put("categoryId",listEntry.getKey()); // 二级分类的id

                ///////////////////////////三级///////////////////////////////////
                List<Map> mapCategory3 = valueCategory2.stream().map(baseCategoryView -> {
                    Map map3 = new HashMap();
                    map3.put("categoryId", baseCategoryView.getCategory3Id());
                    map3.put("categoryName", baseCategoryView.getCategory3Name());
                    return map3;
                }).collect(Collectors.toList());
                ///////////////////////////三级///////////////////////////////////
                map2.put("categoryChild",mapCategory3); // 2级分类的子元素

                mapCategory2.add(map2);
            }


            /////////////////////////二级////////////////////////////////
            map1.put("categoryChild",mapCategory2); // 1级分类的子元素

            map.add(map1); // 返回数据
        }
        return map;
    }

    /**
     * 定时将数据放到本地磁盘上(比如：半夜十二点)
     * 此处使用手动添加的方式
     * 静态化首页
     */
    @GetMapping("/getData")
    @ResponseBody
    public Result getData(){
        // 静态化页面的过程

        String templateName = "index/index"; // 模板位置

        List<Map> list = getIndexCategoryData();
        Context context = new Context();
        context.setVariable("list",list); // 页面所需要的数据

        String path = "C:\\source\\temp\\index.html"; // 临时文件的存储位置
        Writer outputStreamWriter = null;

        try {
            // 为避免乱码 读和写的字符编码要一致
            // 有thymeleaf来读 已经在配置文件中配置读的编码为utf-8
            // 在此处写 因此要将编码配置为utf-8
            outputStreamWriter
                    = new OutputStreamWriter(new FileOutputStream(path), "utf-8");
            /*void process(String var1, IContext var2, Writer var3);*/
            /*参数1：模板
             * 参数2：页面数据
             * 参数3：读写流*/
            templateEngine.process(templateName,context,outputStreamWriter);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(outputStreamWriter!=null){
                try {
                    outputStreamWriter.close(); // 关流 防止空指针异常 先进行判断
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return Result.ok();
    }

    @Autowired
    private TemplateEngine templateEngine;

}
